home *** CD-ROM | disk | FTP | other *** search
- #include "vector.h"
-
- SKALAR distance(VECTOR a,VECTOR b)
- { VECTOR vtmp;
- vecsub(vtmp,a,b);
- return(vecabs(vtmp));
- }
-
-
- void vecprod(VECTOR r,VECTOR a,VECTOR b)
- { VECTOR vtmp;
- vtmp[0]=(a)[1]*(b)[2]-(a)[2]*(b)[1],
- vtmp[1]=(a)[2]*(b)[0]-(a)[0]*(b)[2],
- vtmp[2]=(a)[0]*(b)[1]-(a)[1]*(b)[0],
- vecasn(r,vtmp);
- return;
- }
-
- void norm(VECTOR r, VECTOR a)
- { double dd;
- dd=1/vecabs(a),
- vecmul(r,dd,a);
- return;
- }
-
- void mknormal(VECTOR r,VECTOR v1,VECTOR v2,VECTOR v3)
- {
- VECTOR vtmp1,vtmp2;
- vecsub(vtmp1,v2,v1),
- vecsub(vtmp2,v3,v1),
- vecprod(r,vtmp1,vtmp2);
- return;
- }
-
- void transformc(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w)
- {
- VECTOR vtmp;
- vtmp[0]=(a)[0]*(u)[0]+(a)[1]*(v)[0]+(a)[2]*(w)[0],
- vtmp[1]=(a)[0]*(u)[1]+(a)[1]*(v)[1]+(a)[2]*(w)[1],
- vtmp[2]=(a)[0]*(u)[2]+(a)[1]*(v)[2]+(a)[2]*(w)[2],
- veccpy(r,vtmp);
- return;
- }
-
- int transformd(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w)
- {
- double dd;
- VECTOR vtmp;
- if((dd=det(u,v,w))==0) return(0);
-
- vtmp[0]=det(a,v,w)/dd,
- vtmp[1]=det(u,a,w)/dd,
- vtmp[2]=det(u,v,a)/dd,
- vecasn(r,vtmp);
- return(1);
- }
-
-
-
- void rotxyz(VECTOR r,VECTOR a,VECTOR b)
- {
- SKALAR stmp1,stmp2,stmp;
-
- if(a[0]!=0)
- {
- stmp1=cos(a[0]), stmp2=sin(a[0]);
- (r)[0]=(b)[0],
- stmp =(b)[1]*stmp1-(b)[2]*stmp2,
- (r)[2]=(b)[1]*stmp2+(b)[2]*stmp1,
- (r)[1]=stmp;
- }
- else
- vecasn(r,b);
- if(a[1]!=0)
- {
- stmp1=cos(a[1]), stmp2=sin(a[1]);
- stmp =(r)[0]*stmp1+(r)[2]*stmp2,
- (r)[2]=(r)[2]*stmp1-(r)[0]*stmp2,
- (r)[0]=stmp;
- }
-
- if(a[2]!=0)
- {
- stmp1=cos(a[2]),stmp2=sin(a[2]);
- stmp =(r)[0]*stmp1-(r)[1]*stmp2,
- (r)[1]=(r)[0]*stmp2+(r)[1]*stmp1,
- (r)[0]=stmp;
- }
- return;
- }
-
- void getrotxyz(VECTOR r,VECTOR a,VECTOR b,VECTOR c)
- {
- VECTOR vtmp,vtmp1,vtmp2;
-
- norm(vtmp,a); norm(vtmp1,b); norm(vtmp2,c);
- if((vtmp[0]==0) && (vtmp[1]==0))
- if(vtmp[2]>0)
- { (r)[0]=0; (r)[1]=-M_PI/2; (r)[2]=atan2(-vtmp2[1],-vtmp2[0]);}
- else
- { (r)[0]=0; (r)[1]= M_PI/2; (r)[2]=atan2( vtmp2[1], vtmp2[0]);}
- else
- { (r)[0]=atan2(vtmp1[2],vtmp2[2]);
- (r)[1]=-atan2(vtmp[2],sqrt(vtmp[0]*vtmp[0]+vtmp[1]*vtmp[1]));
- (r)[2]=atan2(vtmp[1],vtmp[0]); }
-
- return;
- }